package com.triadsystems.cashweb.modelo.negocio.servicos.impl;

import java.io.Serializable;
import java.util.Calendar;
import java.util.List;

import javax.inject.Named;

import com.icon.infra.modelo.negocio.excecoes.ConsultaInvalidaException;
import com.icon.infra.modelo.negocio.excecoes.MultiplosResultadosParaRecuperarObjetoException;
import com.icon.infra.modelo.negocio.excecoes.ObjetoNaoEncontradoException;
import com.icon.infra.modelo.persistencia.dao.impl.DAOHibernateTemplate;
import com.triadsystems.cashweb.modelo.negocio.servicos.ICaixaServico;
import com.triadsystems.cashweb.modelo.persistencia.entidades.Caixa;
import com.triadsystems.cashweb.modelo.persistencia.entidades.Usuario;
import com.triadsystems.cashweb.modelo.persistencia.enums.StatusCaixaEnum;

@SuppressWarnings("unchecked")
@Named
public class CaixaServico extends DAOHibernateTemplate<Caixa> implements
		ICaixaServico, Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public Caixa recuperarCaixaUsuarioAberto(Usuario usuario)
			throws MultiplosResultadosParaRecuperarObjetoException,
			ObjetoNaoEncontradoException, ConsultaInvalidaException {
		Caixa resultado = null;
		String hql = "from Caixa c" + " where c.tipoStatusCaixa = :status "
				+ " AND c.usuario = :usuario";

		String[] params = { "status", "usuario" };
		Object[] valores = { StatusCaixaEnum.CAIXA_ABERTO, usuario };

		resultado = recuperarObjetoPorHQL(hql, params, valores);
		return resultado;
	}

	@Override
	public List<Caixa> getCaixabyData(Calendar dataInicio, Calendar dataFim)
			throws ObjetoNaoEncontradoException, ConsultaInvalidaException {
		List<Caixa> resultado = null;

		String hql = "from Caixa c"
				+ " where c.dataAbertura between :dataInicio and :dataFim"
				+ " ORDER BY c.id";

		String[] params = { "dataInicio", "dataFim" };
		Object[] valores = { dataInicio, dataFim };

		resultado = recuperarObjetosPorHQL(hql, params, valores, false);

		return resultado;
	}

	public List<Caixa> getCaixabyDataUsuario(Calendar dataInicio,
			Calendar dataFim, Usuario usuario)
			throws ObjetoNaoEncontradoException, ConsultaInvalidaException {
		List<Caixa> resultado = null;

		String hql = "from Caixa c"
				+ " where c.dataAbertura between :dataInicio and :dataFim"
				+ " and c.usuario = :usuario" + " order by c.id";

		String[] params = { "dataInicio", "dataFim", "usuario" };
		Object[] valores = { dataInicio, dataFim, usuario };
		resultado = recuperarObjetosPorHQL(hql, params, valores, false);

		return resultado;
	}

	public Caixa getUltimoCaixaAberto(Usuario usuario)
			throws MultiplosResultadosParaRecuperarObjetoException,
			ObjetoNaoEncontradoException, ConsultaInvalidaException {
		Caixa resultado = null;

		getHibernateTemplate().setMaxResults(1);
		String hql = "from Caixa c" + " where c.usuario =:usuario"
				+ " order by c.dataAbertura desc";

		String[] params = { "usuario" };
		Object[] valores = { usuario };

		resultado = recuperarObjetoPorHQL(hql, params, valores);
		getHibernateTemplate().setMaxResults(0);
		return resultado;
	}

	public List<Caixa> getCaixasAbertosPanel()
			throws ConsultaInvalidaException, ObjetoNaoEncontradoException {
		List<Caixa> resultado = null;

		Calendar dataInicio = Calendar.getInstance();
		dataInicio.set(Calendar.HOUR_OF_DAY, 6);
		dataInicio.set(Calendar.MINUTE, 0);
		dataInicio.set(Calendar.SECOND, 0);

		Calendar dataFim = Calendar.getInstance();
		dataFim.set(Calendar.HOUR_OF_DAY, 18);
		dataFim.set(Calendar.MINUTE, 0);
		dataFim.set(Calendar.SECOND, 0);

		System.out.println(dataInicio.getTime());
		System.out.println(dataFim.getTime());

		String hql = "from Caixa c"
				+ " where c.dataAbertura between :dataInicio and :dataFim"
				+ " order by c.id";

		String[] params = { "dataInicio", "dataFim" };
		Object[] valores = { dataInicio, dataFim };
		resultado = recuperarObjetosPorHQL(hql, params, valores, false);
		return resultado;
	}

	public Long getCodProximaTransacao() {
		String sql = "select cw_seq_transacao.nextval from dual";
		return getNextKey(sql);
	}

}
